#include "hcsr04.h"

uint64_t g_time=0;				//计时
uint64_t g_time_end=0;		//回波信号时间

/**
 * @brief       超声波模块初始化
 * @param       NULL
 * @retval      NULL
 */
void hcsr04_init(void)
{
	GPIO_InitTypeDef gpio_init_structure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	
	gpio_init_structure.GPIO_Mode = GPIO_Mode_Out_PP;		//设置GPIO口为推挽输出
	gpio_init_structure.GPIO_Pin = TRIG_PIN;
	gpio_init_structure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&gpio_init_structure);
	
	gpio_init_structure.GPIO_Mode = GPIO_Mode_IPD;			//设置GPIO口为下拉输入模式
	gpio_init_structure.GPIO_Pin = ECHO_PIN;
	GPIO_Init(GPIOB,&gpio_init_structure);
	GPIO_WriteBit(GPIOB,TRIG_PIN,Bit_RESET);						//输出低电平
}

/**
 * @brief       测距
 * @param       NULL
 * @retval      距离（mm）
 */
s16 sonar_mm(void)
{
	u32 distance,distance_mm = 0;
	TRIG=1;
	delay_us(15);
	TRIG=0;
	while(ECHO==0);
	g_time=0;
	while(ECHO==1);
	g_time_end=g_time;								//记录结束时的时间
	if(g_time_end/100<38){						//判断是否小于38毫秒，大于38毫秒的就是超时，直接调到下面返回0
		distance=(g_time_end*346)/2;		//计算距离，25°C空气中的音速为346m/s
		distance_mm=distance/100;				//因为上面的time_end的单位是10微秒，所以要得出单位为毫米的距离结果，还得除以100
	}
	return distance_mm;
}

/**
 * @brief       测距
 * @param       NULL
 * @retval      距离（m）
 */
float sonar(void)
{
	u32 distance,distance_mm = 0;
	float distance_m=0;
	TRIG=1;
	delay_us(15);
	TRIG=0;
	while(ECHO==0);
	g_time=0;
	while(ECHO==1);
	g_time_end=g_time;
	if(g_time_end/100<38){
		distance=(g_time_end*346)/2;
		distance_mm=distance/100;
		distance_m=distance_mm/1000;
	}
	return distance_m;
}

/**
 * @brief       定时器1中断函数(每10微秒变量g_time加1)
 * @param       NULL
 * @retval      NULL
 */
void TIM1_UP_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM1, TIM_IT_Update) == SET){		//获取TIM1定时器的更新中断标志位
		g_time++;
		TIM_ClearITPendingBit(TIM1, TIM_IT_Update);				//清除更新中断标志位
	}
}
